package org.hbkj.springbootmybatis.service;

import org.hbkj.springbootmybatis.dao.BuyDao;
import org.hbkj.springbootmybatis.entity.BuyDo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.util.UUID;

/**
 * 购物车和购买业务逻辑处理
 */
@Service
public class BuyService {

    private final BuyDao buyDao;

    // 构造器注入BuyDao
    public BuyService(BuyDao buyDao) {
        this.buyDao = buyDao;
    }

    /**
     * 加入购物车
     * @param buyDo 前端传递的购物车数据（需包含userId、goodsId、quantity等）
     * @return 操作结果（1=成功，0=失败）
     */
    public int addToCart(BuyDo buyDo) {
        // 参数校验
        Assert.notNull(buyDo.getUserId(), "用户ID不能为空");
        Assert.notNull(buyDo.getGoodsId(), "商品ID不能为空");
        Assert.notNull(buyDo.getQuantity(), "购买数量不能为空");
        Assert.isTrue(buyDo.getQuantity() > 0, "购买数量必须大于0");

        // 计算总价（单价 × 数量）
        if (buyDo.getPrice() != null) {
            buyDo.setTotalAmount(
                    buyDo.getPrice().multiply(BigDecimal.valueOf(buyDo.getQuantity()))
            );
        }

        // 调用Dao层插入购物车表
        return buyDao.addToCart(buyDo);
    }

    /**
     * 立即购买（创建订单+扣减库存）
     * @param buyDo 前端传递的订单数据（需包含userId、goodsId、quantity、price等）
     * @return 操作结果（1=成功，0=失败）
     */
    @Transactional  // 事务管理：确保订单创建和库存扣减同时成功或失败
    public int purchase(BuyDo buyDo) {
        // 参数校验
        Assert.notNull(buyDo.getUserId(), "用户ID不能为空");
        Assert.notNull(buyDo.getGoodsId(), "商品ID不能为空");
        Assert.notNull(buyDo.getQuantity(), "购买数量不能为空");
        Assert.isTrue(buyDo.getQuantity() > 0, "购买数量必须大于0");
        Assert.notNull(buyDo.getPrice(), "商品单价不能为空");

        // 1. 生成唯一订单ID（UUID）
        String orderId = UUID.randomUUID().toString().replaceAll("-", "");
        buyDo.setOrderId(orderId);

        // 2. 计算订单总价
        buyDo.setTotalPrice(
                buyDo.getPrice().multiply(BigDecimal.valueOf(buyDo.getQuantity()))
        );

        // 3. 扣减商品库存（返回0表示库存不足）
        int stockResult = buyDao.deductStock(buyDo.getGoodsId(), buyDo.getQuantity());
        if (stockResult == 0) {
            throw new IllegalArgumentException("库存不足，购买失败");
        }

        // 4. 创建订单（插入orders表）
        return buyDao.createOrder(buyDo);
    }
}